package shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

import java.util.ArrayList;
import java.util.List;

/**
 * 对shiro框架的基本学习使用第一阶段
 * 全部数据在代码中写死
 */
public class MyShiroTest {

    public static void main(String[] args) {
        // 创建默认SecurityManager用于管理security
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        // 创建IniRealm对象用于从ini文件中读取信息
        IniRealm iniRealm = new IniRealm("classpath:shiro/shiro.ini");
        // 设置iniRealm到默认的SecurityManager
        defaultSecurityManager.setRealm(iniRealm);
        // 使用securityUtils工具类装载默认的securitymanager
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        // 从securityUtils获取对应的subject对象. 至此shrio的准备工作完成 准备模拟登录
        Subject subject = SecurityUtils.getSubject();
        // 此处为模拟登录时用户输入的账号密码
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("zhangsan", "123");
        // 使用subject.login模拟登陆过程
        //  设置try-catch块捕捉验证login登录异常
        try {
            subject.login(usernamePasswordToken);
            System.out.println("shiro验证登录成功");
            // 判断当前用户的角色
            List<String> roles = new ArrayList<String>();
            roles.add("admin");
            roles.add("adminplus");
            roles.add("adminpro");
            // 循环测试角色
            for (String role : roles) {
                System.out.println("当前用户是" + subject.getPrincipal() + "\t 是否具有" + role + "角色 \t" + subject.hasRole(role));
            }
            // 判断当前用户的权限
            List<String> permissions=new ArrayList<String>();
            permissions.add("update");
            permissions.add("delete");
            permissions.add("add");
            permissions.add("get");
            // 循环验证当前用户是否具有对应的权限
            for(String permission:permissions)
            {
                System.out.println("当前用户是"+subject.getPrincipal()+"\t 是否具有"+permission+"权限 \t"+subject.isPermitted(permission));
            }
            // 验证当前用户是否登录成功
            System.out.println(subject.getPrincipal() + "是否登录成功?" + subject.isAuthenticated());
            // 登出当前用户
            subject.logout();
            // 验证当前用户是否登出
            System.out.println(subject.getPrincipal() + "是否登录成功?" + subject.isAuthenticated());
        } catch (UnknownAccountException uae) {
            System.out.println("未知的账户名");
        } catch (IncorrectCredentialsException ice) {
            System.out.println("密码错误");
        } catch (Exception e) {
            System.out.println("shiro验证异常");
        }


    }
}
